package lambda;

public class Lambda03 {
    public static void main(String[] args) {
        /**
         *方法引用：可以快速将一个Lambda表达式的实现指向一个已经写好的方法
         *语法：方法的隶属者，静态方法隶属者为类，非静态方法的隶属者是对象
         * 即：“方法的隶属者：方法名”
         * 注意事项：
         * 1.被引用的方法的参数数量以及类型一定要和接口中的方法参数数目一致
         * 2.被引用的方法的返回值一定要和接口中的方法返回值一致
         *
         *
         * 假如我们在程序中对于某个接口方法需要调用许多次，那么用以下的方法创建对象，来调用方法就是不太好的
         * 缺点：如果将来要对方法进行改变，那么所有用Lambda表达式定义的对象都要更改，这在设计模式上就是有问题的；
         *      */
        LambdaSingleReturnSingleParameter lambda1 = a -> a * 2;
        LambdaSingleReturnSingleParameter lambda2 = a -> a * 2;
        /**
         * 我们一般是写一个通用的方法，并将其引用至Lambda表达式中
         */

        LambdaSingleReturnSingleParameter lambda3 = a -> change(a);//在Lambda表达式中使用 一般方法调用 方式
        LambdaSingleReturnSingleParameter lambda4 = Lambda03::change;//在Lambda表达式种使用方法引用（方法隶属于类 静态方法）
        System.out.println(lambda4.test(2));
        Lambda03 lambda03 = new Lambda03();//非静态方法需要对象才能被调用
        LambdaSingleReturnSingleParameter lambda5 = lambda03::change2;//在Lambda表达式种使用方法引用（方法隶属于对象）
        System.out.println(lambda5.test(3));
        LambdaSingleReturnMultipleParameter lambda6 = lambda03::change3;//多参数的引用方法使用
        System.out.println(lambda6.test(1,2));
    }



    private static int change(int a) {
        return a * 2;
    }

    private int change2(int a) {
        return a * 2;
    }
    private int change3(int a, int b) {
        return a * 2 + b * 3;
    }
}
